package ${basePackage}.core.${moduleName}.domain;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;

import javax.persistence.*;
import java.io.Serializable;

/**
 * 代码生成器自动生成<BR>
 * 实体类对应数据表[${remarks}]
 * Date:${.now}
 * @author
 */
@Data
@ToString
@EqualsAndHashCode
@Accessors(chain = true)
@Table(name = "${tableName}")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ${className} extends AbstractTreeEntity<${className}> implements Serializable{

    private static final long serialVersionUID = 1L;

<#list fields as field>
    /** ${field.remarks}*/
    <#if field.fieldName == keyName>
    @Id
    <#if field.fieldType == 'Integer'>
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    </#if>
    </#if>
    @Column(name = "${field.fieldDbName}")
    private ${field.fieldType} ${field.fieldName};
</#list>

    public ${className}(){
        getInfraRepository();
    }

    private ${className}Repository ${classObjectName}Repository;

    @Override
    public ${className}Repository getInfraRepository() {
        if (null == infraRepository) {
            infraRepository = InstanceFactory.getInstance(${className}Repository.class);
        }
        return (${className}Repository) infraRepository;
    }

    @Override
    public Serializable getPrimaryKey() {
        return get${keyNameUp}();
    }

    @Override
    public boolean existed() {
        // 判断是否有相同ID的数据
        if (null != getPrimaryKey()) {
            ${className} entity = getInfraRepository()
                .selectByPrimaryKey(getPrimaryKey());
            if (null != entity) {
                return true;
            }
        }
        return false;
    }

    /* ************************************************************************************ *
       ***************************************  增  ***************************************
    * ************************************************************************************* */

    /**
    * 新建${className}
    * TODO 补充调整代码
    */
    /*
    public void save() {
        // 判断设置primaryKey sta
        // 判断当前实体是否有设置主键
        if (isPrimaryKeyEmpty()) {
            // 当前实体未设置主键，则创建主键并赋值
            String uuid = StringUtils.get32UUID();
            while (true) {
            // 排除生成的ID重复
                if (null == selectByPrimaryKey(uuid)) {
                    break;
                }
                uuid = StringUtils.get32UUID();
            }
            set${keyNameUp}(uuid);
        }
        // 判断设置primaryKey end
        if (existed()) {
            Shift.fatal(BasicRestStatus.DATA_REPEAT_ERROR);
        }
        getInfraRepository().insert(this);
    }
    */

    /* ************************************************************************************ *
       ***************************************  删  ***************************************
    * ************************************************************************************* */



    /* ************************************************************************************ *
       ***************************************  改  ***************************************
    * ************************************************************************************* */

    /**
    * 根据Id，更新${className}
    * TODO 补充调整代码
    *
    * @param
    * @return
    */
    /*
    public void update() {
        // 判断当前实体是否设置了主键，若未设置，则抛出异常，终止后续操作
        ParamNullException.build()
            .validate(getPrimaryKey());
        // 根据主键，获取旧数据
        ${className} oldEntity = selectByPrimaryKey(getPrimaryKey());
        // 判断旧数据是否存在，若不存在，则抛出异常，终止后续操作
        DataNullException.build("无法进行更新操作，原${className}数据不存在!").validate(oldEntity);

        getInfraRepository().updateByPrimaryKeySelective(this);
    }
    */

    /* ************************************************************************************ *
       ***************************************  查  ***************************************
    * ************************************************************************************* */

    /**
    * 根据查询条件查询列表
    * TODO 补充调整代码
    *
    * @return
    */
    /*
    public List<${className}> selectByQuery() {
        List<${className}> list = (List<${className}>) getSysRoleRepository().select(this);
        return list;
    }
    */

    /**
    * 根据查询条件查询列表
    * TODO 补充调整代码
    *
    * @param dto
    * @return
    */
    /*
    public List<${className}> selectListByQuery(${className} dto) {
        if(null == dto){
            return (List<${className}>) selectAll();
        }
        List<${className}> list = (List<${className}>) getInfraRepository().select(dto);
        return list;
    }
    */

    /**
    * 根据查询条件查询分页列表
    * TODO 补充调整代码
    *
    * @param page
    * @return
    */
    /*
    public PageResult<${className}> selectPageByQuery(PageResult page, ${className} dto) {
        PageHelper.startPage(page.getPageNum(), page.getPageSize());
        PageInfo<${className}> pageInfo = new PageInfo((List) getInfraRepository()
            .select(dto));
        page.setTotal(pageInfo.getTotal());
        page.setPageData(pageInfo.getList());
        PageHelper.clearPage();
        return page;
    }
    */

}